package alkuperainen;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Kirjuri {

    private final String kurssit = "kaikkiKurssit.txt";
    private final String opiskelijat = "kaikkiOpiskelijat.txt";
    private File kurssitTiedosto = new File(kurssit);
    private File opiskelijatTiedosto = new File(opiskelijat);

    public Kirjuri() {
        if (!kurssitTiedosto.exists()) {
            try {
                kurssitTiedosto.createNewFile();
            } catch (IOException e) {
                System.out.println("Virhe! Tiedostoa ei voitu luoda. Ohjelman suoritus p��ttyy.");
            }
        }
        if (!opiskelijatTiedosto.exists()) {
            try {
                opiskelijatTiedosto.createNewFile();
            } catch (IOException e) {
                System.out.println("Virhe! Tiedostoa ei voitu luoda. Ohjelman suoritus p��ttyy.");
            }
        }
    }

    public void kirjoitaKurssitTiedostoon(ArrayList<Kurssi> kaikkiKurssit) {
        try {
            ObjectOutputStream kirjoittaja = new ObjectOutputStream(new FileOutputStream(kurssitTiedosto));
            kirjoittaja.writeObject(kaikkiKurssit);
            kirjoittaja.close();
        } catch (Exception e) {
            System.out.println("Valitettavasti tiedostoon ei voitu kirjoittaa.");
        }
    }

    public void kirjoitaOpiskelijatTiedostoon(ArrayList<Opiskelija> kaikkiOpiskelijat) {
        try {
            ObjectOutputStream kirjoittaja = new ObjectOutputStream(new FileOutputStream(opiskelijatTiedosto));
            kirjoittaja.writeObject(kaikkiOpiskelijat);
            kirjoittaja.close();
        } catch (Exception e) {
            System.out.println("Valitettavasti tiedostoon ei voitu kirjoittaa.");
        }
    }

    public ArrayList<Kurssi> lueKurssitTiedostosta() {
        ArrayList<Kurssi> kaikkiKurssit = new ArrayList<Kurssi>();

        try {
            ObjectInputStream lukija = new ObjectInputStream(new FileInputStream(kurssitTiedosto));

            kaikkiKurssit = (ArrayList<Kurssi>) lukija.readObject();
            lukija.close();
        } catch (Exception e) {
        }
        return kaikkiKurssit;
    }

    public ArrayList<Opiskelija> lueOpiskelijatTiedostosta() {
        ArrayList<Opiskelija> kaikkiOpiskelijat = new ArrayList<Opiskelija>();

        try {
            ObjectInputStream lukija = new ObjectInputStream(new FileInputStream(opiskelijatTiedosto));

            kaikkiOpiskelijat = (ArrayList<Opiskelija>) lukija.readObject();
            lukija.close();
        } catch (Exception e) {
        }
        return kaikkiOpiskelijat;
    }

    //HTML-exporttauskoodi alkaa
    public boolean exportHTML(Opiskelija o, String tiedostopolku) {
        return exportHTML(o.getIlmot(), tiedostopolku);
    }

    public boolean exportHTML(ArrayList<Kurssi> kurssit, String tiedostopolku) {
        String[][] taulu = new String[7][24];

        for (Kurssi k : kurssit) {
            for (Tapahtuma t : k.getTapahtumat()) {
                lisaaTauluun(taulu, t);
            }
        }
        return tallennaTaulu(taulu,tiedostopolku);
    }

    private void lisaaTauluun(String[][] taulu, Tapahtuma t) {
        String lisays = t.getNimi() + " (" + t.getPaikka() + " " + t.getAlkuaika() + "-" + t.getLoppuaika() + ")";

        for (int aikalokero : laskeLokerot(t)) {
            if (taulu[t.getPaivaIndex()][aikalokero] != null) {
                taulu[t.getPaivaIndex()][aikalokero] += " | " + lisays;
            }
            taulu[t.getPaivaIndex()][aikalokero] = lisays;
        }
    }

    private boolean tallennaTaulu(String[][] taulu, String tiedostopolku) {
        PrintStream writer = null;
        try {
            String dataout = "<html><body><table border='1'><tr><td><td>Maanantai<td>Tiistai" +
                    "<td>Keskiviikko<td>Torstai<td>Perjantai<td>Lauantai<td>Sunnuntai";
            File writeto = new File(tiedostopolku);
            if(!writeto.exists()){
                if(!writeto.createNewFile()){
                    return false;
                }
            }
            writer = new PrintStream(writeto);
            
            for (int lokero = 0; lokero < 24; lokero++) {
                for (int pv = 0; pv < 7; pv++) {
                    if(pv==0){
                        dataout+="<tr><td>" + lokero + " - " + (lokero+1);
                    }
                    if(taulu[pv][lokero]!=null){
                        dataout+="<td>" + taulu[pv][lokero];
                    }else{
                        dataout+="<td>&nbsp;";
                    }
                }
            }
            dataout += "</table><body></html>";
            writer.print(dataout);
            writer.close();
            return true;
        } catch (Exception ex) {
            return false;
        }
    }

    private ArrayList<Integer> laskeLokerot(Tapahtuma t) {
        ArrayList<Integer> lokerot = new ArrayList<Integer>();

        for (int i = t.getAlkutunti(); i < 24 && i <= t.getLopputunti(); i++) {
            lokerot.add(i);
        }
        return lokerot;
    }
    //HTML-tallentajan koodi loppuu
}
